x86/mca: MCA bank extension
authorLiu, Jinsong <jinsong.liu@intel.com>
Mon, 9 May 2011 10:42:45 +0000 (11:42 +0100)
committerLiu, Jinsong <jinsong.liu@intel.com>
Mon, 9 May 2011 10:42:45 +0000 (11:42 +0100)
Current mca_summay use uint32_t as bitmask of bank uc/pcc/recoverable.
It's not extensible, support no more than 32 mca banks, while
according to Intel SDM, bank number could be as much as 256.

This patch use bool_t flag since it only need to record and indicate
the most severity case.

Signed-off-by: Liu, Jinsong <jinsong.liu@intel.com>
xen/arch/x86/cpu/mcheck/mce.c
xen/arch/x86/cpu/mcheck/mce.h

index 5e0a6a28663f6f52d6e123092792b4043e2ba6ba..4f03ad6d8aba34e2c38a70f1bb09bf10d224dafc 100644 (file)
@@ -246,7 +246,8 @@ mctelem_cookie_t mcheck_mca_logout(enum mca_source who, struct mca_banks *bankma
     uint64_t gstatus, status;
     struct mcinfo_global *mig = NULL; /* on stack */
     mctelem_cookie_t mctc = NULL;
-    uint32_t uc = 0, pcc = 0, recover, need_clear = 1, mc_flags = 0;
+    bool_t uc = 0, pcc = 0, recover = 1, need_clear = 1;
+    uint32_t mc_flags = 0;
     struct mc_info *mci = NULL;
     mctelem_class_t which = MC_URGENT; /* XXXgcc */
     int errcnt = 0;
@@ -280,7 +281,7 @@ mctelem_cookie_t mcheck_mca_logout(enum mca_source who, struct mca_banks *bankma
      */
     recover = (mc_recoverable_scan)? 1: 0;
 
-    for (i = 0; i < 32 && i < nr_mce_banks; i++) {
+    for (i = 0; i < nr_mce_banks; i++) {
         struct mcinfo_bank *mib;  /* on stack */
 
         /* Skip bank if corresponding bit in bankmask is clear */
@@ -324,13 +325,13 @@ mctelem_cookie_t mcheck_mca_logout(enum mca_source who, struct mca_banks *bankma
             }
         }
 
-        /* form a mask of which banks have logged uncorrected errors */
-        if ((status & MCi_STATUS_UC) != 0)
-            uc |= (1 << i);
+        /* flag for uncorrected errors */
+        if (!uc && ((status & MCi_STATUS_UC) != 0))
+            uc = 1;
 
-        /* likewise for those with processor context corrupt */
-        if ((status & MCi_STATUS_PCC) != 0)
-            pcc |= (1 << i);
+        /* flag processor context corrupt */
+        if (!pcc && ((status & MCi_STATUS_PCC) != 0))
+            pcc = 1;
 
         if (recover && uc)
             /* uc = 1, recover = 1, we need not panic.
index f87fd08481c507adb34c779545e018cd702d3998..6762d1abcc540f7c7c1084af50c42662bc64c505 100644 (file)
@@ -119,10 +119,9 @@ struct mca_summary {
        uint32_t        errcnt; /* number of banks with valid errors */
        int             ripv;   /* meaningful on #MC */
        int             eipv;   /* meaningful on #MC */
-       uint32_t        uc;     /* bitmask of banks with UC */
-       uint32_t        pcc;    /* bitmask of banks with PCC */
-       /* bitmask of banks with software error recovery ability*/
-       uint32_t        recoverable; 
+       bool_t          uc;     /* UC flag */
+       bool_t          pcc;    /* PCC flag */
+       bool_t          recoverable; /* software error recoverable flag */
 };
 
 DECLARE_PER_CPU(struct mca_banks *, poll_bankmask);